package com.young.pattern.singletonPattern;

import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;
import lombok.extern.slf4j.Slf4j;

/**
 * 客户端测试嘞
 */
@Slf4j
public class Client {

    /**
     * 单例模式:
     *  确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例；
     * 结构:
     *  单例模式是结构最简单的设计模式,它只包含一个类,即单例类.
     * 单例模式的实现:
     *  1,单例类构造函数的可见性为private;
     *  2,提供一个类型为自身的静态私有成员变量
     *  3,提供一个工友的静态工厂方法
     *
     * 单例模式优缺点:
     *  1,单例模式提供了对唯一实例的受控访问.因为单例类封装了他的唯一实例,所以他可以严格控制客户怎样以及何时访问它
     *  2,由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象,单例模式无疑可以提高系统的性能
     *  3,允许可变数目的实例.基于单例模式可以进行扩展,使用和控制单例对象相似的方法来获得指定个数的实例对象,既节省系统资源,又
     *  解决了由于单例对象共享过多有损性能的问题;
     * 缺点:
     *  1,由于单例模式中没有抽象层,因此单例类的扩展有很大的困难;
     *  2,单例类的职责过重,在一定程度上违背了单一职责原则.因为单例类既提供了业务方法,又提供了创建对象的方法(工厂方法),将对象的创建
     *      和对象本身的功能耦合在一起.
     *  3,现在很多面向对象语言的运行都提供了自动垃圾回收技术,因此如果实例化的共享对象长时间不被利用,系统会认为它是垃圾,会自动销毁并回收资源,
     *      下次利用时又将重新实例化,这将导致共享的单例对象状态的丢失
     *
     */


    public static void main(String[] args) {
        LoadBalancer loadBalancerA = LoadBalancer.getLoadBalancer();
        LoadBalancer loadBalancerB = LoadBalancer.getLoadBalancer();
        LoadBalancer loadBalancerC = LoadBalancer.getLoadBalancer();
        LoadBalancer loadBalancerD = LoadBalancer.getLoadBalancer();
        if (loadBalancerA == loadBalancerB && loadBalancerB == loadBalancerC && loadBalancerC == loadBalancerD){
            log.info("loadBalance对象为同一个");
        }
        if (loadBalancerA.equals(loadBalancerB)&&loadBalancerB.equals(loadBalancerC)&&loadBalancerC.equals(loadBalancerD)){
            log.info("loadBalance的值相同");
        }
        loadBalancerA.addServer("Server1");
        loadBalancerA.addServer("server2");
        loadBalancerA.addServer("server3");
        loadBalancerA.addServer("server4");

        for (int i = 0 ;i<10;i++){
            log.info("分发请求至服务器:{}",loadBalancerB.getServer());
        }
    }

}
